package com.haydn.practice.restfulweb.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;

/**
 * @Author haydn
 * @create 2020/9/2 23:03
 * 这个类是参考bilibi的视频 ： https://www.bilibili.com/video/BV1KE411i7bC?t=1121&p=2
 * 认证 和 授权
 */
//@Configuration
@EnableWebSecurity//开启WebSecurity模式
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    /**
     * 定制请求的授权规则
     */
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        // 首页所有人可以访问
        http.authorizeRequests().antMatchers("/").permitAll()
                .antMatchers("/level1/**").hasRole("vip1")
                .antMatchers("/level2/**").hasRole("vip2")
                .antMatchers("/level3/**").hasRole("vip3");

        /**
         * 开启自动配置的登录功能
         * /login 请求来到登录页
         * /login?error 重定向到这里表示登录失败，此时没有权限的时候，就会跳转到登录页面
         * 这里需要配置一个登录页和前面授权访问的各个页面，此处先暂时不做处理
         */
        http.formLogin();

        /**
         * 开启注销功能
         * 同时配置登出之后去首页（或者其他指定的页面）
         */
        http.logout().logoutUrl("/");
    }

    /**
     * 定义认证规则
     * 在SpringSecurity 5.0 之后新增了很多加密规则
     * 我们需要对前端传过来的密码进行某种方式的加密，否则无法登陆
     * 官方推荐使用bcrypt的方式
     * 用这种方式就能规避错误，使账号密码正确生效了，但是还没有解决验证密码之后的error页面问题
     */
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication().passwordEncoder(new BCryptPasswordEncoder())
                .withUser("Fire")
                .password(new BCryptPasswordEncoder().encode("Ace"))
                .roles("god")
                .and()
                .withUser("Sea")
                .password(new BCryptPasswordEncoder().encode("Haydn"))
                .roles("god", "farmer")
                .and()
                .withUser("guest")
                .password(new BCryptPasswordEncoder().encode("20111629"))
                .roles("farmer");
    }


}
